let s1!: string
let s2!: number | string

s2 = 'a' // 此处开始类型收窄，s2 被收窄为 string 类型
s1 = s2


let o1 = {a: 1, b: 'aaa'}
if ('k' in o1) {
    // 发生了具体的类型收窄的计算过程
    //     let o1: {
    //     a: number;
    //     b: string;
    // } & Record<"k", unknown>
    console.log(o1)
}

function X(a: any): a is string {
    return true // 返回true，表示a 是 string类型
}

if (X(o1)) {
    // 发生了类型收窄，& string
    // let o1: {
//     a: number;
//     b: string;
// } & string
    console.log(o1)
}

function AssertIsNumber(a: any): asserts a is number {
    if (true) {
        throw new Error('...')
    } 
}

AssertIsNumber(o1)

console.log(o1)